# VM Ware 的网络模式

本文主要介绍 VM 的三种网络模式: 桥接, NAT, 仅主机(Host-Only), 然后尝试创建一个包含内网的网络结构. 全文基于 Win-VM15 专业版.

# 网络模式

默认情况下 VM 针对它的三种网络模式提供了三种虚拟网络适配器: vmnet0, 处理桥接; vmnet1, 处理 Host-Only 网络模式; vmnet8 处理 NAT 模式. 如果我们使用 Win 系统中的 CMD 或是 Mac 中的 Terminal, 使用 ifconfig 或是 ipconfig 命令总能看到系统中拥有的各种适配器, 其中就能看到 vmnet1 和 vmnet8.

现在先假设我们的宿主机的 IP 为 192.168.1.101. 现实中, 我们的路由器总是习惯开一个 192.168.1.**\24 的网段出来.

# 桥接

虚拟机将被分配一个网络中的独立 IP, 比如 192.168.1.102, 它与宿主机在同一个子网下. 在外网设备看来, 宿主机与虚拟机是平起平坐的. 宿主机与虚拟机之间可以相互 ping 通.

如果我们从 VM 的角度看过去, VM 为虚拟机创建了一个虚拟网卡. 不要忘了宿主机中已经有了一个虚拟网络适配器: vmnet0, 这里 vmnet0 的作用与交换机类似. 虚拟机的虚拟网卡与宿主机的物理网卡可以看做是接入了 vmnet0 中. 这里涉及到的两张网卡与 vmnet0 都工作在 192.168.1.**\24 网段下.

桥接的方式用起来能让我们的虚拟机在网络中看起来更加真实. 我们甚至可以在主机 A 中通过 ssh 访问同网段下的主机 B 中的桥接模式的虚拟机. 但是, 桥接毛病也是有的, 需要占用宿主机所在的网段中的一个 IP. 如果 IP 资源紧张或是被限制申请使用, 桥接模式就不能很好地工作.

# NAT 模式

NAT: Network Address Translation. 在虚拟机想访问其他网络设备时, VM 会将虚拟系统的IP地址转换成宿主机的IP地址,从而达到访问其他主机及外网的目的。在外网看来, 宿主机挂记在主机下并伪装成主机, 连接外网.

这种网络模式下, VM 会默默地做很多事情. 首先是创建提供 NAT 服务的虚拟设备, 宿主机的物理网卡在收发虚拟机的数据时都要利用这台 NAT 服务器. 接下来, VM 需要为虚拟机和物理机创建虚拟网卡, 并将两张虚拟网卡接入到虚拟网路适配器 VMnet8 中, 这里 VMnet8 开了一个子网出来, 同时还扮演网关的角色. 到这个时候, 宿主机已经有两张网卡, 它可以同时与两个不同网段下的设备通信, 例如 192.168.1.**/24192.168.200.**/24.

简单且不专业地说, 如果位于 192.168.200.**/24 网段下的虚拟机打算发送数据给 Google.com, 当 IP 包通过虚拟机虚拟网卡来到宿主机, 宿主机利用 NAT 服务器更换 IP 包的源地址为 192.168.1.101, 最后通过物理网卡发送出去.

# 仅主机模式

虚拟机只与主机相连, 虚拟机与外网的通信共享主机的网卡. 简单地看, 仅主机模式就像 NAT 模式砍掉了 NAT 服务器. VMnet1 也开了一个子网, 同时充当网关的角色, 但是数据从虚拟机出来就只能在子网中流动 (本质上, 宿主机可以看做是子网中的成员).

这玩意在创建内网的时候贼好使.

# 创建一个稍微复杂点的网络

# 故事背景

XX 公司的服务器们: 一台网站服务器, 向普通用户提供公司主页服务; 两台数据服务器, 为网站服务器提供支持. 公司为自家服务器们创建了一个网络, 要求普通用户能够访问网站服务器, 但是无法访问数据服务器; 而网站服务器与数据服务器之间可以相互访问. 如下图:

假设我们叫做张三. 我们尝试在 VM 中利用 CentOS 创建出这样的网络. 显然网站服务器比较特殊, 需要两张网卡同时连接两个网段. 为了简单起见, 我们认为网站服务器与张三的机子在同一个局域网下.

# 创建

虚拟机们使用的适配器:

  • 数据服务器 1:
    host-only (vmnet1)
  • 数据服务器 2:
    host-only (vmnet1)
  • 网站服务器:
    桥接 (vmnet0) && host-only (vmnet1)
  • 张三的机子:
    桥接 (vmnet0)

在虚拟机的设置中可以自由添加或修改网络适配器.

# 效果

虚拟机们的网卡状态 (每台机子都不一样):

  • 数据服务器 1:
    ens33: 192.168.20.129/24
  • 数据服务器 2:
    ens33: 192.168.20.130/24
  • 网站服务器:
    ens33: 192.168.1.105/24 (vmnet0)
    ens37: 192.168.20.128/24 (vmnet1)
  • 张三的机子:
    ens33: 192.168.1.108/24

这里创建了两个网段: 192.168.20.**/24 以及 192.168.1.**/24 (宿主机也在这个网段下). 我们可以使用 ping 命令随意测试.

其实吧, 再创建一个 vmnet2, 然后两个桥接的换成 vmnet2 也会有一样的效果, 就是宿主机会连不上.

# 意外的情况

在宿主机使用 WiFi 连接的情况下, 将虚拟机的网络状态从 NAT 切换为桥接状态时, 虚拟机的网络状态并不会立刻改变, 需要等一段时间. 网线连接时体验会好得多.

如果在给虚拟机添加网络适配器后, 没有达到预期的效果, 检查一下 systemctl status network.service 看看有没有错误, 比如说 failed to start LSB. 可以尝试重启 NetworkManager systemctl restart NetworkManager 与 network.service systemctl restart network.service.

# 总结与参考

桥接能够让虚拟机和宿主平起平坐, 结构简单, 但是必然会占用内网 IP; 而 NAT 模式虽然复杂一些, 但是通过将虚拟机挂记到宿主机的方式, 不需要考虑内网 IP 的分配情况, 是一种更加通用的手段. Host-Only 则是创建自定义网络结构的神器.

VM 也允许我们创建除三个模式适配器以外的适配器, vmnet2~vmnet7, 以及 vmnet9, 但是貌似网络模式只能选择 Host-Only. 所有的网络适配器可以在 VM 中的虚拟网络编辑器中进行修改.

戴思达-深入理解 VMware 虚拟机网络通信原理

Last Updated: 11/4/2020, 8:13:01 PM